from sqlalchemy import create_engine
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy.orm import sessionmaker, scoped_session

from common.config import conf

IP = conf["DB"]["ip"]
USERNAME = conf["DB"]["username"]
PASSWD = conf["DB"]["passwd"]
PORT = conf["DB"]["port"]
DBNAME = conf["DB"]["dbname"]


# mysql+pymysql://<username>:<password>@<host>/<dbname>[?<options>]
# 直接只用 create_engine 时，就会创建一个带连接池的引擎,
# pool_recycle, 默认为 -1, 设置为 7200, 即如果connection空闲了7200秒，自动重新获取，
# 以防止 connection 被 db server 关闭
# pool_size=200, 连接数大小，默认为5
# max_overflow=10, 超出pool_size后可允许的最大连接数，默认为 10,
# 这10个连接在使用过后，不放在 pool中，而是被真正关闭的
# poolclass=NullPool,禁用sqlalchemy提供的连接池，session.close时断开连接
engine = create_engine("mysql+pymysql://{}:{}@{}:{}/{}".format(
    USERNAME, PASSWD, IP, PORT, DBNAME), pool_recycle=7200, pool_size=200,
    max_overflow=20)
Base = declarative_base()
# sessionmaker()创建了一个工厂类，在创建这个工厂类时我们配置了参数绑定了引擎。
# 将其赋值给Session。每次实例化Session都会创建一个绑定了引擎的Session。
# 这样这个session在访问数据库时都会通过这个绑定好的引擎来获取连接资源
# 当你编写应用程序时， 请将sessionmaker工厂放在全局级别，视作应用程序配置的一部分
# 线程不安全，不可跨线程使用，可使用局部变量使用，
# 需要数据库交互的时候实例化，每次实例化都会创建一个绑定了引擎得Session
db_session = scoped_session(sessionmaker(bind=engine))



